home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library / Microsoft Programmer's Library (CD-ROM Database)(125-099-008)(Version 1.1a)(CDRM 162100)(1989).iso / SAMPCODE / ADVOS2 / CH08 / DUMP.ASM < prev    next >
Assembly Source File  |  1988-12-12  |  12KB  |  345 lines

  1.     title    DUMP -- Display File Contents
  2.         page    55,132
  3.         .286
  4.  
  5. ;
  6. ; DUMP.ASM
  7. ;
  8. ; Displays the binary contents of a file in hex and ASCII on the
  9. ; standard output device.
  10. ;
  11. ; Assemble with:  C> masm dump.asm;
  12. ; Link with:  C> link dump,,,os2,dump
  13. ;
  14. ; Usage is:  C> dump pathname.ext  [>destination]
  15. ;
  16. ; Copyright (C) 1988 Ray Duncan
  17. ;
  18.  
  19. cr      equ     0dh                     ; ASCII carriage return
  20. lf      equ     0ah                     ; ASCII line feed
  21. blank   equ     20h                     ; ASCII space code
  22.  
  23. blksize equ     16                      ; size of input file records
  24.  
  25. stdout  equ     1                       ; standard output handle
  26. stderr  equ     2                       ; standard error handle
  27.  
  28.         extrn   DosOpen:far
  29.         extrn   DosRead:far
  30.         extrn   DosWrite:far
  31.         extrn   DosClose:far
  32.         extrn   DosExit:far
  33.  
  34.         extrn   argc:near               ; returns argument count
  35.         extrn   argv:near               ; returns argument pointer
  36.  
  37. DGROUP  group   _DATA
  38.  
  39.  
  40. _DATA   segment word public 'DATA'
  41.  
  42. fname   db      64 dup (0)              ; name of input file
  43.  
  44. fhandle dw      0                       ; input file handle
  45.  
  46. faction dw      0                       ; action from DosOpen
  47.  
  48. fptr    dw      0                       ; relative file address
  49.  
  50. rlen    dw      0                       ; actual number of bytes 
  51.                                         ; read by DosRead
  52.  
  53. wlen    dw      0                       ; actual number of bytes
  54.                                         ; written by DosWrite
  55.  
  56. output  db      'nnnn',blank,blank      ; output format area
  57. outputa db      16 dup ('nn',blank)
  58.         db      blank
  59. outputb db      16 dup (blank),cr,lf
  60. output_len equ $-output
  61.  
  62. hdg     db      cr,lf
  63.         db      7 dup (blank)
  64.         db      '0  1  2  3  4  5  6  7  '
  65.         db      '8  9  A  B  C  D  E  F',cr,lf
  66. hdg_len equ $-hdg
  67.  
  68. fbuff   db      blksize dup (?)         ; data from file
  69.  
  70. msg1    db      cr,lf
  71.         db      'dump: file not found'
  72.         db      cr,lf
  73. msg1_len equ $-msg1
  74.  
  75. msg2    db      cr,lf
  76.     db    'dump: missing filename'
  77.         db      cr,lf
  78. msg2_len equ $-msg2
  79.  
  80. msg3    db      cr,lf
  81.         db      'dump: empty file'
  82.         db      cr,lf
  83. msg3_len equ $-msg3
  84.  
  85. _DATA   ends    
  86.  
  87.  
  88. _TEXT   segment word public 'CODE'
  89.  
  90.         assume  cs:_TEXT,ds:DGROUP
  91.  
  92. dump    proc    far                     ; entry point from OS/2
  93.  
  94.         push    ds                      ; make DGROUP addressable
  95.         pop     es                      ; via ES
  96.  
  97.         call    argc                    ; is filename present
  98.         cmp     ax,2                    ; in command tail?
  99.         je      dump1                   ; yes, proceed 
  100.  
  101.         mov     dx,offset msg2          ; missing or illegal filespec,
  102.         mov     cx,msg2_len
  103.         jmp     dump9                   ; display error message and exit
  104.  
  105. dump1:                                  ; copy filename from command
  106.                                         ; tail to local buffer
  107.  
  108.         mov     ax,1                    ; get pointer to command tail
  109.         call    argv                    ; argument in ES:BX 
  110.         mov     cx,ax                   ; CX = filename length 
  111.         mov     di,offset fname         ; DS:DI = local buffer
  112.  
  113. dump2:  mov     al,es:[bx]              ; copy filename byte by byte
  114.         mov     [di],al
  115.         inc     bx
  116.         inc     di
  117.         loop    dump2   
  118.  
  119.         push    ds                      ; restore ES = DGROUP
  120.         pop     es
  121.  
  122. dump4:                                  ; try to open file...
  123.         push    ds                      ; address of filename
  124.         push    offset fname
  125.         push    ds                      ; receives file handle
  126.         push    offset fhandle
  127.         push    ds
  128.         push    offset faction          ; receives DosOpen action
  129.         push    0                       ; file size (ignored)
  130.         push    0
  131.         push    0                       ; file attribute (ignored)
  132.     push    1            ; OpenFlag:
  133.                     ; fail if file doesn't exist
  134.         push    40h                     ; OpenMode: deny-none,
  135.                     ; deny-none, access = read-only
  136.         push    0                       ; reserved DWORD 0
  137.         push    0
  138.         call    DosOpen                 ; transfer to OS/2
  139.         or      ax,ax                   ; was open successful?
  140.         jz      dump5                   ; yes, proceed
  141.         
  142.         mov     dx,offset msg1          ; open failed, display
  143.         mov     cx,msg1_len             ; error message and exit
  144.         jmp     dump9                   
  145.  
  146. dump5:  call    rdblk                   ; initialize file buffer
  147.         cmp     rlen,0                  ; anything read?
  148.         jne     dump6                   ; jump, got some data 
  149.     cmp    fptr,0            ; no data, was this first read?
  150.         jne     dump8                   ; no, end of file reached
  151.  
  152.     mov    dx,offset msg3        ; empty file, print error
  153.         mov     cx,msg3_len             ; message and exit
  154.         jmp     dump9
  155.  
  156. dump6:  test    fptr,07fh               ; time for a heading?
  157.         jnz     dump7                   ; no, jump
  158.  
  159.                                         ; write heading...
  160.         push    stdout                  ; standard output handle
  161.         push    ds                      ; address of heading
  162.         push    offset hdg              
  163.         push    hdg_len                 ; length of heading
  164.         push    ds                      ; receives bytes written
  165.         push    offset wlen
  166.         call    DosWrite
  167.  
  168. dump7:  call    cnvblk                  ; convert one block of 
  169.                                         ; binary data to ASCII
  170.  
  171.                                         ; write formatted output...
  172.         push    stdout                  ; standard output handle
  173.         push    ds                      ; address of output
  174.         push    offset output           
  175.         push    output_len              ; length of output
  176.         push    ds                      ; receives bytes written
  177.         push    offset wlen
  178.         call    DosWrite
  179.  
  180.         jmp     dump5                   ; get more data
  181.  
  182. dump8:                                  ; end of file reached...
  183.         push    fhandle                 ; close input file 
  184.         call    DosClose                ; transfer to OS/2
  185.  
  186.                                         ; final exit to OS/2...
  187.         push    1                       ; terminate all threads
  188.     push    0            ; return code = 0 (success)
  189.         call    DosExit                 ; transfer to OS/2
  190.  
  191. dump9:                                  ; print error message on
  192.                                         ; standard error device 
  193.         push    stderr
  194.         push    ds                      ; address of message
  195.         push    dx
  196.         push    cx                      ; length of message
  197.         push    ds                      ; receives bytes written
  198.         push    offset wlen
  199.         call    DosWrite                ; transfer to OS/2
  200.  
  201.                                         ; final exit to OS/2...
  202.         push    1                       ; terminate all threads
  203.     push    1            ; return code = 1 (error)
  204.         call    DosExit                 ; transfer to OS/2
  205.         
  206. dump    endp
  207.  
  208.  
  209. ; RDBLK:    Read block of data from input file
  210. ;
  211. ; Call with:    nothing
  212. ; Returns:    AX = error code (0 = no error)
  213. ; Uses:         nothing
  214.  
  215. rdblk   proc    near
  216.  
  217.         push    fhandle                 ; input file handle
  218.         push    ds                      ; buffer address
  219.         push    offset fbuff
  220.         push    blksize                 ; buffer length
  221.         push    ds                      ; receives bytes read
  222.         push    offset rlen
  223.         call    DosRead                 ; transfer to OS/2
  224.         ret                             ; back to caller
  225.  
  226. rdblk   endp
  227.  
  228.  
  229. ; CNVBLK:    Format one binary record for output
  230. ;
  231. ; Call with:    nothing
  232. ; Returns:      nothing 
  233. ; Uses:         AX, BX, CX, DX, DI
  234.  
  235. cnvblk  proc    near
  236.  
  237.         mov     di,offset output        ; clear output format 
  238.         mov     cx,output_len-2         ; area to blanks
  239.         mov     al,blank
  240.         rep stosb
  241.  
  242.         mov     di,offset output        ; convert current file 
  243.         mov     ax,fptr                 ; offset to ASCII
  244.         call    wtoa
  245.  
  246.         xor     bx,bx                   ; point to start of data
  247.  
  248. cb1:    mov     al,[fbuff+bx]           ; get next byte of data
  249.                                         ; from input file
  250.  
  251.     lea    di,[bx+outputb]     ; calculate output address
  252.                                         ; for ASCII equivalent
  253.         mov     byte ptr [di],'.'       ; if control character,
  254.         cmp     al,blank                ; substitute a period   
  255.     jb    cb2            ; jump, not alphanumeric
  256.         cmp     al,7eh          
  257.     ja    cb2            ; jump, not alphanumeric
  258.     mov    [di],al         ; store ASCII character
  259.  
  260. cb2:                                    ; now convert byte to hex
  261.         mov     di,bx                   ; calculate output address
  262.     imul    di,di,3         ; (position*3) + base address
  263.         add     di,offset outputa       
  264.         call    btoa                    ; convert data byte to hex 
  265.  
  266.         inc     bx                      ; advance through record
  267.         cmp     bx,rlen                 ; entire buffer converted?
  268.         jne     cb1                     ; no, get another byte
  269.  
  270.         add     fptr,blksize            ; update file offset
  271.  
  272.         ret                             ; back to caller
  273.  
  274. cnvblk  endp
  275.  
  276.  
  277. ; WTOA:         Convert word to hex ASCII
  278. ; Call with:    AX    = data to convert
  279. ;               ES:DI = storage address
  280. ; Returns:      nothing
  281. ; Uses:         AX, CL, DI
  282.  
  283. wtoa    proc    near
  284.  
  285.         push    ax                      ; save original value
  286.         mov     al,ah
  287.         call    btoa                    ; convert upper byte    
  288.  
  289.         pop     ax                      ; restore original value
  290.         call    btoa                    ; convert lower byte
  291.  
  292.         ret                             ; back to caller
  293.  
  294. wtoa    endp
  295.  
  296.  
  297. ; BTOA:         Convert byte to hex ASCII
  298. ; Call with:    AL    = data to convert
  299. ;               ES:DI = storage address
  300. ; Returns:      nothing
  301. ; Uses:         AX, CL, DI
  302.  
  303. btoa    proc    near
  304.  
  305.         sub     ah,ah                   ; clear upper byte
  306.  
  307.         mov     cl,16                   ; divide by 16
  308.         div     cl
  309.  
  310.         call    ascii                   ; convert quotient
  311.         stosb                           ; store ASCII character
  312.  
  313.         mov     al,ah
  314.         call    ascii                   ; convert remainder 
  315.         stosb                           ; store ASCII character
  316.  
  317.         ret                             ; back to caller
  318.  
  319. btoa    endp
  320.  
  321.  
  322. ; ASCII:        Convert nibble to hex ASCII
  323. ; Call with:    AL    = data to convert in low 4 bits
  324. ; Returns:      AL    = ASCII character
  325. ; Uses:         nothing
  326.  
  327. ascii   proc    near
  328.  
  329.         add     al,'0'                  ; add base ASCII value  
  330.         cmp     al,'9'                  ; is it in range 0-9?
  331.         jle     ascii2                  ; jump if it is
  332.  
  333.         add     al,'A'-'9'-1            ; no, adjust for range A-F
  334.  
  335. ascii2: ret                ; return ASCII character in AL
  336.  
  337. ascii   endp
  338.  
  339. _TEXT   ends
  340.  
  341.         end     dump
  342.